package com.lemon.exam.common.crud;

import com.lemon.exam.common.web.Param;
import org.springframework.data.domain.Page;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Map;

/**
 * 基本Service接口，主要配置基本的增删改查，用来被实现
 *
 * @author Lemon
 * @since 2025/3/24 11:47
 */
public interface BaseService<T, ID> {
    /**
     * 新增
     *
     * @param param
     * @return
     */
    Mono<String> insert(T param);

    /**
     * 修改
     *
     * @param param
     * @return
     */
    Mono<String> update(T param);

    /**
     * 删除
     *
     * @param id
     * @return
     */
    Mono<String> deleteById(ID id);

    /**
     * 查询
     *
     * @param id
     * @return
     */
    Mono<?> findById(ID id);

    /**
     * 判断是否存在
     *
     * @param id
     * @return
     */
    Mono<Boolean> existsById(ID id);

    /**
     * 根据id查询
     *
     * @param ids
     * @return
     */
    Flux<?> findAllById(Iterable<ID> ids);

    /**
     * 查询总数
     *
     * @param param
     * @return
     */
    Mono<Long> count(Map<String, Object> param);

    /**
     * 查询
     *
     * @param param
     * @return
     */
    Flux<?> find(Map<String, Object> param);

    /**
     * 分页查询
     *
     * @param param
     * @return
     */
    Mono<Page<?>> page(Param param);

    /**
     * 启用
     *
     * @param id
     * @return
     */
    Mono<String> enable(ID id);

    /**
     * 停用
     *
     * @param id
     * @return
     */
    Mono<String> unable(ID id);
}
